package com.dimples.dd.system.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.dimples.dd.mybatis.core.mapper.BaseMapperX;
import com.dimples.dd.mybatis.core.query.LambdaQueryWrapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.model.entity.SystemUserRoleDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.Collection;
import java.util.List;
import java.util.Map;

@Mapper
public interface SystemUserRoleMapper extends BaseMapperX<SystemUserRoleDO> {
    /**
     * 获取角色绑定的用户数
     *
     * @param roleId 角色ID
     */
    default int countUsersForRole(Long roleId) {
        LambdaQueryWrapperX<SystemUserRoleDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.eqIfPresent(SystemUserRoleDO::getRoleId, roleId);
        return selectCount(wrapperX).intValue();
    }

    /**
     * 获取角色绑定的用户列表
     *
     * @param roleIds 角色ID列表
     */
    default List<Long> selectRoleIdsExistAssignedUsers(List<Long> roleIds) {
        MPJLambdaWrapperX<SystemUserRoleDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.select(SystemUserRoleDO::getRoleId).select("count(1) as num")
                .in(SystemUserRoleDO::getRoleId, roleIds)
                .ge("num", 1)
                .groupBy(SystemUserRoleDO::getRoleId)
        ;
        List<Map<String, Object>> maps = this.selectMaps(wrapperX);
        return maps.stream().map(map -> Long.valueOf(map.get("role_id").toString())).toList();
    }

    /**
     * 获取用户绑定的角色列表
     *
     * @param userId 用户ID
     */
    default List<SystemUserRoleDO> selectListByUserId(Long userId) {
        return selectList(SystemUserRoleDO::getUserId, userId);
    }

    /**
     * 删除用户绑定的角色列表
     *
     * @param userId 用户ID
     * @param roleIds 删除的角色ID列表
     */
    default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) {
        delete(new LambdaQueryWrapper<SystemUserRoleDO>()
                .eq(SystemUserRoleDO::getUserId, userId)
                .in(SystemUserRoleDO::getRoleId, roleIds));
    }

}